package mystudy
// 面向对象 结构体之方法
import "fmt"

type Integer int

func (i Integer)absoluteValue()(Integer){
	fmt.Println("修改之前：", i)
	if i < 0 {
		i = -i
	}
	fmt.Println("修改之后：", i)
	return i
}

func(i *Integer)String() string{
	fmt.Println("===Str===")
	fmt.Println(*i)
	fmt.Println("===End===")
	return "诸葛"
}

type Stu struct{
	Name string
	Age int
}


type teacher struct{
	Name string
	age int
}

func InitTeacher(name string, age int)*teacher{
	return &teacher{name, age}
}



func DemoObjStruct(){
	fmt.Println("------方法扩展------")
	var num Integer
	num = -100
	num1 := num.absoluteValue()
	fmt.Println(&num)
	fmt.Println(&num1)
	var nint int
	fmt.Println(&nint)
	// 结构体调用方法
	fmt.Println("------结构体调用方法------")
	fmt.Println((num).absoluteValue())
	fmt.Println((&num).absoluteValue())
	fmt.Println("------结构体声明方法------")
	// 1.直接赋值方式，但顺序不能变
	var a1 Stu  = Stu{"张三", 19} 
	fmt.Println(a1)
	// 2.使用key赋值:注意最后一个结尾要加逗号
	var a2 Stu = Stu{
		Name:"谢思肖",
		Age:21,
	}
	fmt.Println(a2)
	// 3.指针声明
	var a3 *Stu = &Stu{"龙丹丹", 18}
	fmt.Println(a3, *a3)
	var a4 *Stu = &Stu{
		Name:"谢思肖",
		Age:21,
	}
	fmt.Println(a4, *a4)

	var te *teacher
	te = &teacher{"wagn", 22}
	fmt.Println(te)
	(*te).Name = "www"
	fmt.Println(te)
}